home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 2: Applications / Linux Cubed Series 2 - Applications.iso / utils / console / splitvt-.000 / splitvt- / splitvt-1.6.1 / lock.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-01-09  |  2.1 KB  |  98 lines

  1.  
  2. /* The screen locking module for splitvt */
  3.  
  4. #include    <stdio.h>
  5. #include    <pwd.h>
  6. #include    "vt100.h"
  7.  
  8. #define UNLOCKED    0
  9. #define ENTERED1    1
  10. #define ENTERED2    2
  11. #define LOCKED        3
  12.  
  13. static int lock_state=UNLOCKED;
  14.  
  15. /* The number of characters entered (prevent overflow) */
  16. static int cnt=0;
  17.  
  18. static char entered1[BUFSIZ], entered2[BUFSIZ];
  19. static char *nextbuf=entered1;
  20. static struct passwd *pw=NULL;
  21.  
  22. /* Used to release our input when the screen is unlocked */
  23. extern void (*do_input)(), normal_input();
  24.  
  25. /* Since this function is called as an input function, we need to handle
  26.    all state here. 
  27. */
  28. void lock_screen(c)
  29. char c;
  30. {
  31.     char message[512];
  32.  
  33.     if ( c == '\r' ) {
  34.         switch (lock_state) {
  35.             case UNLOCKED:    /* No password entered, cancel lock */
  36.                     vt_info("Lock cancelled.");
  37.                     reset_bar(1);
  38.                     do_input=normal_input;
  39.                     break;
  40.             case ENTERED1:    /* First password has been entered */
  41.                     *nextbuf='\0';
  42.                     nextbuf=entered2;
  43.                     cnt=0;
  44.                     vt_info("Re-enter password: ");
  45.                     lock_state=ENTERED2;
  46.                     break;
  47.             case ENTERED2:    /* Second password has been entered */
  48.                     *nextbuf='\0';
  49.                     nextbuf=entered1;
  50.                     cnt=0;
  51.                     if (strcmp(entered1, entered2) == 0) {
  52.                         sprintf(message,
  53.                 "Screen locked by %s.  Enter password: ", 
  54.                             pw?pw->pw_name:"user");
  55.                         vt_info(message);
  56.                         lock_state=LOCKED;
  57.                     } else {
  58.                         sprintf(message,
  59.                 "Passwords do not match.  Try again: ");
  60.                         vt_info(message);
  61.                         lock_state=UNLOCKED;
  62.                     }
  63.                     break;
  64.             case LOCKED:    /* Verify password  */
  65.                     *nextbuf='\0';
  66.                     nextbuf=entered1;
  67.                     cnt=0;
  68.                     if (strcmp(entered1, entered2) == 0) {
  69.                         vt_info(NULL);
  70.                         do_input=normal_input;
  71.                         lock_state=UNLOCKED;
  72.                     } else {
  73.                         sprintf(message,
  74.                     "Password incorrect.  Try again: ");
  75.                         vt_info(message);
  76.                     }
  77.                     break;
  78.             default:    /* What?? */
  79.                     break;
  80.         }
  81.     } else {
  82.         switch (lock_state) {
  83.             case UNLOCKED:    /* No password entered, start lock */
  84.                     pw=getpwuid(getuid()); /* Can fail */
  85.                     nextbuf=entered1;
  86.                     lock_state=ENTERED1;
  87.                     /* Fall through */
  88.             case ENTERED1:
  89.             case ENTERED2:
  90.             case LOCKED:
  91.                     if (cnt < BUFSIZ-1) *(nextbuf++) = c;
  92.                     break;
  93.         }
  94.     }
  95.     return;
  96. }
  97.  
  98.